#!/usr/bin/env python2

import sys,binascii,time,random;

sys.path.append('../../../trunk/client/')

from GoodFETAVR import GoodFETAVR;
from GoodFETGlitch import *;
from intelhex import IntelHex16bit, IntelHex;

import sqlite3;


if(len(sys.argv)==1):
    print "Usage: %s chip verb [objects]\n" % sys.argv[0];
    print "%s avr learn" % sys.argv[0];
    print "%s avr explore" % sys.argv[0];
    print "%s avr graph" % sys.argv[0];
    print "%s avr graphx11" % sys.argv[0];
    print "%s avr points" % sys.argv[0];
    print "%s avr npoints" % sys.argv[0];
    print """
This populates a database, glitch.db, with a record of all attempted
glitches.  Graphs can then be generated from the results, allowing
results to be replicated on different hardware and models.  The general
sequence for a new chip is as follows.

On a sample chip for the same model as the target,
1) Run 'goodfet $chip learn' in order to learn the glitching voltages.
2) Run 'goodfet $chip crunch' in order to precompute glitching ranges.
3) Run 'goodfet $chip explore [tstart tstop]' to find a time at which to glitch.

Then on a chip to be extracted,
3) Run 'goodfet $chip exploit' to exploit a chip and recover its firmware."""
    sys.exit();

glitcher=GoodFETGlitch();

if(sys.argv[2]=="graphx11"):
    glitcher.graphx11();
    exit();
if(sys.argv[2]=="graph"):
    glitcher.graph();
    exit();
if(sys.argv[2]=="points"):
    glitcher.points();
    exit();
if(sys.argv[2]=="rangepoints"):
    glitcher.rpoints();
    exit();

if(sys.argv[2]=="crunch"):
    glitcher.crunch();
    exit();

glitcher.setup(sys.argv[1]);

if(sys.argv[2]=="learn"):
    glitcher.learn();
if(sys.argv[2]=="explore"):
    times=None;
    if(len(sys.argv)>=4):
        times=range(int(sys.argv[3]),
                    int(sys.argv[4]));
    glitcher.explore(times);
if(sys.argv[2]=="exploit"):
    print "Coming soon.";

